/*
 * @Author: lin_zizhuo 2297304135@qq.com
 * @Date: 2023-11-27 08:54:54
 * @LastEditors: lin_zizhuo 2297304135@qq.com
 * @LastEditTime: 2023-11-27 14:22:10
 * @FilePath: /signal_text/signal_store/process.cc
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
#include <iostream>
#include <signal.h>
#include <unistd.h>

// 由于信号不一定需要立即执行，所以信号需要有保存功能
// 在linux，每个进程都有三张表表示信号的阻塞，保存和处理方法
// 注意，信号的阻塞和忽略是两种不同的概念！！

using namespace std;
// sigset_t
// int sigemptyset(sigset_t *set);
// int sigfillset(sigset_t *set);
// int sigaddset(sigset_t *set, int signo);
// int sigdelset(sigset_t *set, int signo);
// int sigismember（const sigset_t *set, int signo);

void myhandler(int signo)
{
    cout << "I get a sig: " << signo << endl;
}

void print_pending(const sigset_t &pending)
{
    for (int i = 31; i >= 1; --i)
    {
        if (sigismember(&pending, i))
            cout << '1';
        else
            cout << '0';
    }
    cout << endl
         << endl;
}

int main()
{
    signal(2, myhandler);
    sigset_t bset, oset;
    sigemptyset(&bset);
    sigemptyset(&oset);
    // 1. 屏蔽二号信号
    sigaddset(&bset, 2);
    sigprocmask(SIG_BLOCK, &bset, &oset);
    int cnt = 0;
    sigset_t pending;
    // 刚开始接受到信号，由于处于阻塞状态，所以不会处理，但是会放入pending表
    // 之后解除信号，此时不在阻塞，会处理2号信号
    while (++cnt)
    {
        cout << "I'm running!, cnt: " << cnt << endl;
        sigpending(&pending);
        print_pending(pending);
        if (cnt == 10)
            sigprocmask(SIG_SETMASK, &oset, nullptr);
        sleep(1);
    }
    return 0;
}